FAQ (DX11 шаг за шагом)
Общие вопросы по вики Зачем изучать DX11, если есть DX9? Я заметил, что очень многие почему-то считают что начинать надо с DX9 и только потом переходить на DX11. Это неверно. DX9 устарел, и хотя до сих пор делают игры на нем, вы ведь завтра игру не сделаете, в лучшем случае через год или через два. То есть к тому времени когда вы будете способны делать игры, технологии могут сто раз поменяться, поэтому стоит всегда начинать с самых новых. Кроме того скорее всего консоли нового поколения также будут использовать современное GAPI (DX11/OGL 4 или выше). Это первая причина. Вторая - DX11 проще по синтаксису. А почему не OpenGL? Не всем он нравится. Не все собираются делать игры под линуксы и маки (а в консоли вас все равно не пустят). Проблемы с драйверами - не все конечные пользователи умеют их правильно устанавливать (я вот до сих пор не могу обновить драйвер своей видеокарты 2010 года, потому что криворукие драйверописатели что-то там сделали, из-за чего их драйверы не опознают мою видеокарту, и поэтому не хотят устанавливаться. ну и как я буду играть в игру на OpenGL 4?). Хотя, возможно, я когда-нибудь и начну писать статьи по OGL, но не сейчас. Подготовка Что нужно знать Вы должны знать С++, чуть выше написания хеловорда. Будет хорошо, если вы до этого писали какие-то проекты. Если вы не знаете С++ или начали его изучать в прошлом месяце - продолжайте изучать С++, вам еще рано изучать голый GAPI. Вы спешите и хотите сделать игру завтра? Unity вам в помощь, знать DX для этого вам не нужно - там уже все за вас сделали. Вы уникум умеющий все изучать за неделю? Чтож, я вас предупредил, большинство возникших проблем у читателей было связано как раз с незнанием программирования или IDE. Хотя не волнуйтесь, я пытаюсь помочь даже начинающим, ведь сам был когда-то таким же и тоже DX (тогда DX9) решил изучать на вторую неделю обучения программированию:) Нужно хоть как-то читать по английски, я конечно статьи пишу на русском, но ведь не одну же эту вики вы будете читать:) Как минимум придется читать хелп из DirectX SDK. Если с английским проблемы, советую тогда скачать программу-переводчик (я использую PROMT). Что нужно скачать Вам, нужна IDE, если вы достаточно опытны, то любая к которой можно подключить DirectX SDK. Если вы не опытны, то Visual Studio 2010. Не Visual studio 2008 (из-за того что я использую новый стандарт С++). И не Visual Studio 2012 (там возможно есть какие-то заморочки, хотя можете попробовать, вдруг не будет проблем). Постарайтесь понять как создается статическая библиотека, как библиотеки подключаются к проекту, что такое RELEASE и что такое DEBUG. А в случае проблем вам нужно понимать, как сделать пошаговое выполнение приложения, и вообще иметь общие представления об дебаге приложения. Скачать VS 2010 совершенно бесплатно и легально можно здесь. Но это урезанная версия, могут возникнуть проблемы (все они давно вылечены - гугл вам в помощь:)) На свой страх и риск можете скачать VS 2012 оттуда же, но я не гарантирую вам работоспособность уроков. Ну и еще вы можете скачать полную версию IDE с торрентов, например с рутреккера (у меня ultimate).:) Кроме того вам нужно скачать DirectX 11 SDK. Это дело лежит здесь Обратите внимание - это версия за июль 2010 года. Сейчас есть более новая версия (DX 11.1) которая идет в Windows SDK, но я ее пока не буду рассматривать, из-за не слишком важных изменений, и вам не советую начинать с нее - нет ни примеров, ни документации (точнее они есть, на сайте Microsoft, но их там еще найти надо:) ). Документация лежит в Microsoft DirectX SDK (June 2010)\Documentation\DirectX9: directx_sdk.chm windows_graphics.chm С нею вам придется часто работать. Все что я не описываю (например параметры методов), описано там простым английским языком. Хотя документация должна встроится в IDE (но почему-то это не всегда получается) В папке Microsoft DirectX SDK (June 2010)\Samples\C++ лежат примеры (в том числе и скомпилированные). Вас должны интересовать папки Direct3D10 и Direct3D11 (в них есть папка Bin, в ней уже собранные примеры для запуска) Вопросы по DirectX SDK Какой самый новый и где взять? На данный момент самый новый - 11.1. Работает с Visual Studio 2012. Новые фичи: http://msdn.microsoft.com/en-us/library/windows/desktop/hh404562(v=vs.85).aspx Взять: http://msdn.microsoft.com/en-us/library/windows/desktop/ee663275(v=vs.85).aspx Но я не рекомендую. Не находит заголовок "d3dx9.h", "d3dx10.h" или "d3dx11.h" Скорее всего у вас DX 11.1. В нем вроде как таких заголовков больше нет Об этом написано здесь: http://msdn.microsoft.com/en-us/library/windows/desktop/ee663275(v=vs.85).aspx Wherever "d3dx9.h", "d3dx10.h", or "d3dx11.h" are included in your project, be sure to explicitly include "d3d9.h", "d3d10.h" and "dxgi.h", or "d3d11.h" and "dxgi.h" first to ensure you are picking up the newer version. You can disable warning C4005 if needed; however, this warning indicates you are using the older version of these headers. Remove all references to DXGIType.h in your project. This header doesn't exist in the Windows SDK, and the DirectX SDK version conflicts with the new winerror.h. All D3DX DLLs are installed onto your development computer by the DirectX SDK installation. Ensure that the necessary D3DX dependencies are redistributed with any sample or with your application if it is moved to another machine. Be aware that replacement technologies for current uses of D3DX11 include DirectXTex and DirectXTK. D3DXMath is replaced by DirectXMath. Удалите данные строчки. Вопросы по урокам Как изучать Выполняйте каждый шаг. Будет лучше, если вы не будете пропускать их, так как я раз объяснив, больше не объясняю, и если вы пропустите объяснение, вы не поймете позже. Самый идеальный способ изучения примерно следующий: #Прочитайте статью полностью, не особо вчитываясь в код и вообще обзорно. Это нужно чтобы понять структуру урока и найти те места где дается объяснение происходящего. #Если в введении дана теория, и она вам не понятна после чтения данной статьи, поищите нужные слова в гугле - там скорее всего есть масса объяснений и примеров даже на русском языке. Иногда я и сам даю ссылки на полезные статьи. Вы должны хотя бы примерно понять - о чем будет речь, так что сильно много времени не тратьте. #Создайте проект, подключите к нему фреймворк. Если ваша версия фреймворка испортилась, в конце статьи есть архив с исходниками. В этом архиве есть две (или более) папок, одна из них названа D3D_Framework - это и есть папка фреймворка. Не забудьте сначала его скомпилировать. #Начните перепечатывать код из статьи. В идеале вручную копируя только те места которые вы и так понимаете. Если вы прислушаетесь к этому совету, то доведете знание DX до совершенства. Я даю код отрывками, после каждого я часто (но не всегда) даю объяснение происходящего. Завершив перепечатывание одного отрывка, прочтите ниже описание, а затем постарайтесь понять логику кода. Если вам хочется узнать больше о той или иной команде DX, откройте windows_graphics.chm и найдите там описание этой команды. #Продолжайте перепечатывать код. #Не забудьте создать шейдеры. Шейдеры, создаются в обычном блокноте (или аналоге) и кладутся рядом с приложением. И не забудьте их тоже разобрать. #Скомпилируйте приложение и запустите. Сравните ваш результат с результатом из архива с исходниками #Если возникли проблемы, прочтите вопрос " Возникли проблемы, что делать? ". #Если все прошло удачно, просмотрите весь код, постарайтесь изменить что-то (например сдвинуть видовую матрицу, добавить еще несколько мешей, изменить текстуру и т.д.) #Если у вас остались какие-то вопросы по теме, снова обратитесь к гуглу или задайте их в коментариях к статье. Еще вы можете вбить название статьи в гугл и найти кучу теории по данной теме - это позволит вам изучить более полно тот или иной вопрос. Возникли проблемы, что делать? Если код не компилируется: #Вы подключили нужный фреймворк? #Вы правильно настроили проект? #Вы не допустили ошибку при перепечатывании кода? Если ваше приложение компилируется, но не работает: #Для начала убедитесь что ваша видеокарта поддерживает DX10/DX11. Для этого зайдите в папку DX SDK - Microsoft DirectX SDK (June 2010)\Samples\C++\Direct3D11\Bin, и позапускайте оттуда примеры. #Затем скачайте из статьи архив с исходным кодом, зайдите в папку lesson/bin, запустите приложение из нее. #Если оно не заработало, а примеры из DX работают, срочно пишите в комментариях к статье, будем разбираться вместе. #Если пример работает, значит проблема где-то у вас. #Убедитесь, что вы запускаете приложение из папки а не из IDE (либо правильно настроили проект для запуска из IDE), также убедитесь что все нужные шейдеры и ресурсы (модели, текстуры и т.д.) лежат рядом с exe файлом. Убедитесь, что в шейдерах правильный код. Приложение работало, вы внесли изменения, и теперь пустой экран (или сразу пустой экран): #Возможно, неверный шейдер. #Возможно, рисование происходит, но вы направили камеру (видовую матрицу) в другое место и поэтому ничего не видите Ничего не помогло? #Пройдитесь дебагом по коду, шаг за шагом, найдите нерабочее место. Также вы можете везде добавить запись в лог (через Log::Get()) Постарайтесь найти проблемное место кода. #Отпишите в комментариях к статье. Но не "аааа ниче не работает, автор мудак", а четко. Что вам пишет компилятор в случае если приложение не компилируется. На какой строчке вылетает приложение если оно компилируется, но не запускается. Что вы пытались сделать. Работает ли мой код из архива. #А в идеале, вообще выложите ваш код (например на rghost.ru), я его скачаю и детально объясню почему у вас возникли проблемы и как их решить. Только пожалуйста, удаляйте отладочную информацию (папки Debug/Release, фреймворк (если конечно вы его сами не написали), *.lib, *.pdb). У меня не резиновый интернет чтобы качать лишнее. Как помочь вики? #исправляйте орфографические и другие ошибки в статьях #пишите в комментариях более четкие по вашему мнению объяснения того или иного термина, а также интересные ссылки. #указывайте на сложные или непонятные места статьи в комментариях #если есть желание, можете написать свои статьи (хотя хорошо бы перед этим связаться со мною) #если хотите поддержать проект финансово, в моем блоге (ссылка) есть кошелек (свинка) #если вики вам помогла, не забудьте направлять других новичков на нее